package trab_sd;

import java.util.*;

public class FileList extends LinkedList<FileListNode>{
	//Adciona um FileNode. Caso já exista um no com o mesmo
	//nome, adiciona os usuarios do no especificado aos usua-
	//rios do no ja existente.
	public synchronized boolean add( FileListNode file )
	{
		// Verifica se a lista esta vazia. Se estiver, adiciona
		// no comeco da lista.
		if ( isEmpty() )
		return super.add(file);
		
		int i = 0;
		FileListNode tmp = null;
		Iterator itr = this.iterator();
		boolean exist = false;
		
		// Percorre a lista para certificar-se que o no ainda nao 
		// existe.
		while (itr.hasNext())
		{
			i++;
			tmp = (FileListNode) itr.next();
			if (tmp.equals(file))
			{
				exist = true;
				break;
			}
		}
		
		//Se um no com o mesmo no existir, adiciona os usuarios.
		if (exist)
		{
			UserID fln;
			Iterator it = file.getOwnersIterator();
			while (it.hasNext())
			{
				fln = (UserID) it.next();
				tmp.addUser(fln);
			}
			return true;
		}
		// Caso contrario, adiciona o no a lista.
		else
			return super.add(file);
	}
	
	//Remove o no com o nome fornecido.
	public synchronized void remove( String name )
	{
		if ( isEmpty() )
		return;
		
		int i = 0;
		FileListNode tmp = null;
		Iterator itr = this.iterator();
		boolean exist = false;
		//Procura o no especificado.
		while (itr.hasNext())
		{
			i++;
			tmp = (FileListNode) itr.next();
			if (tmp.getName().equals(name))
			{
				//Deleta-o quando encontrado
				itr.remove();
				break;
			}
		}
	}
	
	//Remove as ocorrencias do usuario na lista de arquivos.
	public synchronized void removeUser(UserID id)
	{
		//System.out.println(this);
		Iterator it = iterator();
		FileListNode tmp = null;
		FileList tmpList = new FileList();
		
		//Percorre a lista, removendo os usuarios.
		while (it.hasNext())
		{
			tmp = (FileListNode) it.next();
			//System.out.println(tmp + "\n");
			tmp.removeUser(id);
			//System.out.println(tmp);
			if (!tmp.haveUsers()) {
				it.remove();
			
			}
		}
	}
	
	public synchronized void removeUserFromFile( String name, UserID id ) {
		FileListNode tmp = getByName(name);
		System.out.println(tmp);
		if (tmp!= null) {
			tmp.removeUser(id);
			System.out.println(tmp);
			if (!tmp.haveUsers()) {
				remove(tmp.getName());
			}
		System.out.println(this);	
		}
		
	}
	
	public FileListNode getByName( String name ) {
		Iterator it = iterator();
		FileListNode tmp = null;
		
		//Percorre a lista, removendo os usuarios.
		while (it.hasNext())
		{
			tmp = (FileListNode) it.next();
			if (tmp.getName().equals(name)) {
				return tmp;
			}
		}
		return null;
	}
	
	public String toString() {
		Iterator itr = iterator();
		String ret = String.format("%-21s %-21s %-10s %-10s\n", "Name", "Host", "IP", "Port");
		FileListNode tmp;
		while (itr.hasNext()) {
			tmp = (FileListNode) itr.next();
			ret = ret + tmp;
		}
		return ret;
	}
}
